/**

    网络：让不同的计算机之间进行数据共享，就需要在不同的计算机之间建立连接
     连接 / 传输

    连接： 网线 无线 蓝牙  光
    如何连接？
    网卡：每一块网卡都有一个自己的唯一编号（MAC地址）
        每一块网卡在连接到某个网络的时候会拥有一个固定的IP地址（IP：网络协议）
        IP地址的表示：x.x.x.x (0.0.0.0~255.255.255.255)，这套规则目前是IP协议的第四个版本中的定义，所以也成为IPV4
        这样的地址已经明显不够使用了，最新的一套IP协议规则是IPV6

        127.0.0.1 ： 本地地址
        192.168.0.1
    
    端口： 不同的端口为不同的应用程序进行服务
            一个应用程序可以同时监听多个网卡的多个端口
            一个端口只能同时被一个程序监听

    数据传输协议（TCP / UDP） 有了网络定位协议:IP，再需要做的是定义和选择一个数据的传输协议 
        -TCP
            可靠的，面向连接的协议，传输效率低
            效率要求相对低，但对准确性要求相对高的场景
            文件传输、接收邮件、远程登录
        -UDP
            不可靠的，无连接的服务、传输效率高
            效率要求相对高，但对准确性要求相对低的场景
            在线视频、网络语音电话

    dgram 模块提供了 UDP 数据包 socket 的实现

     net 模块提供了TCP 的socket实现
        数据包：在数据传输的过程中不仅仅只有主体数据（发送的内容），还包含了一些其他的数据信息，比如发送端的ip、端口等，以方便接收者对数据进行处理与回复
        如果发送的数据比较大的话，还会对发送的数据进行分包，每一个包中包含一部分主体数据以及上面提到的额外信息，接收方在接收到数据以后会对数据包进行整合等一系列操作

    HTTP：超文本传输协议
      http是基于TCP/IP协议来定位传输数据
      http是单向单链接、无状态协议

     请求/响应
            请求/响应行
            请求/响应头
            请求/响应正文

            响应行：
                    Http version-name :http协议的版本号
                    status-code ： 状态码
                    message ： 状态码对应的描述
            消息头：
                    Content—Type ： 正文类型（html,png,plain...）  MIME=》多用途互联网邮件扩展类型（https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types）
                                  通过正文类型可以明确知道上下文内容的格式为html格式或普通文本格式或压缩文件格式等等
                    Content-Length ： 发送内容的长度
                                  通过设置此项可以明确知道上下文内容的长度大小，无须等待内容响应完成
                    Location<响应头> ： 重定向地址
                    Cookie<请求头> ： 包含要发送给服务器的cookie
                    Set-Cookie<响应头> ： 服务端向客户端发送cookie
             
             状态码：Http1.1中定义了5类状态码，状态码由三位数组成，第一个数字定义了响应的类型
                    1xx:提示信息-表示请求已被成功接收，继续处理
                    2xx：成功-表示请求已被成功接收，理解，接受
                    3xx：重定向-要完成请求必须进行更近一步的处理
                    4xx：客户端错误-请求有语法错误或请求无法实现
                    5xx: 服务器端错误-服务器未能实现合法的请求
    http模块：
     Server类：createServer()
        事件：
            request ：每当有客户端连接就会触发该事件，该事件有两个参数
               request，response 分别代表请求与响应对象
                   request本质是net.socket+http协议增加的一些内容
                   request.socket => net.socket 
                   request 也就是 IncomingMessage类
                    request.method : 请求方式 post/get 等
                    request.url  请求路径
                    request.headers 请求头信息
                    request.httpVersion 当前http的版本

                   response 也就是ServerResponse类
                   response.end() : 需要在处理完成之后结束当前响应
                   response.setHeader() : 设置响应头信息 
                   response.writeHead(statusCode,statusMessage,Header) : 设置状态码等信息
                        - response.writeHead(301,http.STATUS_CODES[301],{
                            'Location':'/'
                        })
     ClientRequest类：request()
       request :      host 和 port 为tcp协议 必填项
            option:{
                host:  '127.0.0.1'
                port:80     

                protocal：'http'
                method:'get'
                path:'/'                         
            }
            request第二个参数是一个回调函数，该回调函数会在服务器响应时触发，参数为socket对象，可通过data事件和end等事件进行对应的处理
        方法：
         write()  写入数据
         end()   结束写入

 */